package com.cardone.persistent.support;

import java.util.List;

import com.cardone.common.dto.PaginationDto;
import com.cardone.common.po.PoBase;

/**
 * 简易 dao
 *
 * @author yaohaitao
 *
 */
public interface SimpleDao<D extends PoBase> {
	/**
	 * 保存:
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param saveDto
	 *          对象
	 *
	 * @return 对象
	 */
	<P> P saveByIdOrCode(final Class<P> mappedClass, final D saveDto);

	/**
	 * 插入
	 *
	 * @param insertDto
	 *          对象
	 *
	 * @return 影响行数
	 */
	int insertByCode(final D insertDto);

	/**
	 * 插入
	 *
	 * @param insertDtoList
	 *          对象集合
	 *
	 * @return 影响行数
	 */
	int insertByCode(final List<D> insertDtoList);

	/**
	 * 插入
	 *
	 * @param insertDto
	 *          对象
	 *
	 * @return 影响行数
	 */
	int insertByNotExistsCode(final D insertDto);

	/**
	 * 插入
	 *
	 * @param insertDtoList
	 *          对象集合
	 *
	 * @return 影响行数
	 */
	int insertByNotExistsCode(final List<D> insertDtoList);

	/**
	 * 删除
	 *
	 * @param deleteDto
	 *          对象
	 *
	 * @return 影响行数
	 */
	int deleteByIds(final D deleteDto);

	/**
	 * 删除
	 *
	 * @param deleteDto
	 *          对象
	 *
	 * @param whereAndEqProperties
	 *          等于那些属性
	 *
	 * @return 影响行数
	 */
	int deleteByCode(final D deleteDto, final String... whereAndEqProperties);

	/**
	 * 更新
	 *
	 * @param updateDto
	 *          对象
	 *
	 * @return 影响行数
	 */
	int updateByCode(final D updateDto);

	/**
	 * 查询
	 *
	 * @param readDto
	 *          对象
	 * @return 返回数据
	 */
	Integer readByCodeNqIdForCount(final D readDto);

	/**
	 * 更新
	 *
	 * @param updateDtoList
	 *          对象集合
	 * @return 影响行数
	 */
	int updateList(final List<D> updateDtoList);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findDto
	 *          对象
	 * @return 返回对象
	 */
	<P> P findById(final Class<P> mappedClass, final D findDto);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findDto
	 *          对象
	 *
	 * @param whereAndEqProperties
	 *          等于那些属性
	 * 
	 * @return 返回对象
	 */
	<P> P findByCode(final Class<P> mappedClass, final D findDto, final String... whereAndEqProperties);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findDto
	 *          对象
	 *
	 * @return 返回对象
	 */
	<P> P findByCodeOrId(final Class<P> mappedClass, final D findDto);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findListDto
	 *          对象
	 *
	 * @return 对象集合
	 */
	<P> List<P> findListByLikeCode(final Class<P> mappedClass, final D findListDto);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param whereAndEqProperties
	 *          等于那些属性
	 *
	 * @param findListDto
	 *          对象
	 *
	 * @return 对象集合
	 */
	<P> List<P> findListByCode(final Class<P> mappedClass, final D findListDto, final String... whereAndEqProperties);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @return 对象集合
	 */
	<P> List<P> findList(final Class<P> mappedClass);

	/**
	 * 分页
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param paginationDto
	 *          对象
	 *
	 * @return 分页对象
	 */
	<P> PaginationDto<P> paginationByLikeCode(final Class<P> mappedClass, final D paginationDto);
}